package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
 * Author: JacksonCoder
 * FileName: Main
 * Version: 1.0.0
 */

public class Main {

    // 通过反射动态调用方法
    public static void reflectMan(){
        try{
            // 1. 获取 Class 对象
            Class<?> clazz = Class.forName("Man");

            // 2. 创建 Person 类的实例
            Object manInstance = clazz.getDeclaredConstructor().newInstance();

            // 3. 获取 setName 方法（带参数）
            Method setNameMethod = clazz.getMethod("setName", String.class);

            // 4. 调用 setName 方法，设置 name 字段的值
            setNameMethod.invoke(manInstance, "JacksonCoder");

            // 5. 获取 sayHello 方法（无参）
            Method sayHelloMethod = clazz.getMethod("sayHello");

            // 6. 调用 sayHello 方法
            sayHelloMethod.invoke(manInstance);

        } catch (Exception e){
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws Exception {

        //获取Class对象
        Class<?> clazz = Class.forName("java.util.ArrayList");
        System.out.println(clazz + " \n ");

        // Class.getMethods() 和 Class.getDeclaredMethods()
        Method[] methods = clazz.getDeclaredMethods();
        for(Method method : methods){
            System.out.println(method.getName());
        }

        System.out.println(" =============================");

        //Class.getFields() 和 Class.getDeclaredFields()
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }

        System.out.println(" =============================");

        //Class.getConstructors() 和 Class.getDeclaredConstructors()
        Constructor<?>[] constructors = clazz.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor.getName());
        }

        System.out.println("\n =============================");

//        Method method = clazz.getMethod("toString");
//        String result = (String) method.invoke(obj);

        reflectMan();

    }
}
